package cn.edu.lcu.cs.ssm.mapper;

import java.util.List;

import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Repository;

import cn.edu.lcu.cs.ssm.entity.User;

//@Repository
//@Mapper
public interface UserMapper {

	/**
	 * 根据ID查询，返回单个值
	 * 
	 * @param id
	 * @return
	 */
	@Select("select * from user where id=#{id}")
	User findById(Long id);

	/**
	 * 查询所有用户
	 * 
	 * @return
	 */
	@Select("select * from user")
	List<User> findAll();

	/**
	 * 根据用户名查询，返回多个值
	 * 
	 * @param username
	 * @return
	 */
	@Select("select * from user where username=#{username}")
	List<User> findByUsername(String username);

	/**
	 * 根据用户名及密码进行认证，返回认证通过的用户实例
	 * 
	 * @param username
	 * @param password
	 * @return 认证通过的用户，若认证失败返回null
	 */
	@Select("select * from user where username=#{username} and password=#{password}")
	User authenticate(String username, String password);

	/**
	 * 添加用户。可以选择是否返回数据库自动生成的主键。
	 * 
	 * @param user 需要添加到数据库的对象，可能返回数据库生成的主键。
	 * @return 添加记录的数量
	 */
	@Insert("insert into user(username, password, birthdate, real_name) values(#{username}, #{password}, #{birthdate}, #{realName})")
	@Options(useGeneratedKeys = true) // 返回数据库生成的主键
	int save(User user);

	/**
	 * 依据用户ID删除用户
	 * 
	 * @param id
	 * @return 删除用户记录的数量，若删除失败返回0
	 */
	@Delete("delete from user where id=#{id}")
	int delete(Long id);

	/**
	 * 更新用户信息
	 * 
	 * @param user
	 * @return 更新记录的条数，若更新失败返回0
	 */
	@Update("update user set username=#{username}, password=#{password} where id=#{id}")
	int update(User user);

	/**
	 * 返回记录数量
	 * 
	 * @return
	 */
	@Select("select count(*) from user")
	long count();
}
